package gitlet;

import javax.swing.JPanel;
import java.nio.file.WatchService;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchKey;
import java.nio.file.WatchEvent;

/**
 * @Description FileWatchService类提供了一个静态方法用于监视指定目录的变化。当目录中的文件被创建、删除或修改时，会更新指定的面板。
 * @author 陈恒康
 * @date 2023/12/16
 */
public class FileWatchService {

    /**
     * @Description watchDirectory方法用于监视指定目录的变化。当目录中的文件被创建、删除或修改时，会更新指定的面板。
     * @param path 要监视的目录的路径
     * @param jframe 要更新的面板
     * @param repository 与文件列表相关联的仓库对象
     * @author 陈恒康
     * @date 2023/12/16
     */
    public static void watchDirectory(String path, JPanel jframe, Repository repository) {
        try {
            WatchService watchService = FileSystems.getDefault().newWatchService();
            Path dir = Paths.get(path);

            dir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

            WatchKey key;
            while ((key = watchService.take()) != null) {
                for (WatchEvent<?> ignored : key.pollEvents()) {
                    if (ignored != StandardWatchEventKinds.ENTRY_MODIFY) {
                        FileListPanel fileListPanel = new FileListPanel(path, repository);
                        jframe.removeAll();
                        jframe.add(fileListPanel);
                        jframe.revalidate();
                        jframe.repaint();
                    }
                }
                key.reset();
            }
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}